package com.zhouyu.redisExample.redission;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;

/**
 * @author 周宇
 * @version 1.0 date: 2019/7/26 9:37
 * @description: redis操作通用接口
 * @Copyright (C), 2017-2019
 */
public interface IRedisDao<K,V> {
  /**
   * 为key设置value
   * @param key key
   * @param value value
   * @return boolean
   * date: 2018/5/12 12:42
   */
  boolean set(final String key, V value) ;

  /**
   * 为key设置value，并设置过期时间<br/>
   * set value with expireTime
   * @param key key
   * @param value value
   * @param expireTime 过期时间单位为毫秒
   * @return boolean
   * @author yjl
   * date: 18-8-9 下午2:03
   */
  boolean set(final String key, V value, Long expireTime);

  /**
   * 判断是否存在key<br/>
   * Determine if given key exists.
   * @param key key
   * @return boolean
   * @author  yjl
   * date: 18-8-9 下午2:00
   */
  boolean exists(final String key);

  /**
   * 获取key对应的value <br/>
   * Get the value of key.
   * @param key key
   * @return java.lang.Object
   * @author  yjl
   * date: 18-8-9 下午2:02
   */
  V get(final String key, Supplier<V> supplier) ;

  /**
   * 通过多个key查询多个value <br/>
   * Get multiple {@code keys}. Values are returned in the order of the requested keys.
   * @param keys keys
   * @return List<Object>
   * @author  yjl
   * date: 18-8-9 下午7:02
   */
  List<Object> multiGetValue(Collection<String> keys);

  /**
   * 批量设置value
   * @param maps maps
   * @author  yjl
   * date: 18-8-17 下午3:45
   */
  void multiSetValue(Map<String, Object> maps);

  /**
   * 给hashKey对应的hash值，增加delta  <br/>
   * Increment value of a hash hashKey by the given delta.
   * @param key key
   * @param  hashKey hashKey
   * @param delta delta
   * @return Long
   * @author  yjl
   * date: 18-8-17 下午3:48
   */
  Long increment(String key, String hashKey, long delta);

  /**
   * 根据正则表达式匹配所有的key<br/>
   * Find all keys matching the given {@code pattern}.
   * @param pattern 正则pattern
   * @return Set<String>
   * @author  yjl
   * date: 18-8-9 下午6:33
   */
  Set<String> keys(final String pattern);

  /**
   * 删除key和对应的value
   * Delete given key.
   * @param key key
   * @return boolean
   * @author  yjl
   * date: 18-8-9 下午2:04
   */
  boolean remove(final String key) ;

  /**
   * 批量删除key <br/>
   * batch delete
   * @param keys keys
   * @author  yjl
   * date: 18-8-9 下午2:18
   */
  void remove(final Collection<String> keys) ;

  /**
   * 根据正则表达式，批量删除key <br/>
   * batch delete with pattern
   * @param pattern 正则pattern
   * @author  yjl
   * date: 18-8-9 下午2:19
   */
  void removePattern(final String pattern) ;

  /**
   * 设置key的hash，对应hashKey的值
   * @param key key
   * @param hashKey hashKey
   * @param value value
   * @author  yjl
   * date: 18-8-9 下午5:59
   */
  void hashSet(String key, String hashKey, V value);

  /**
   * 获取key的hash，对应hashKey的值
   * @param key key
   * @param hashKey hashKey
   * @return java.lang.Object
   * @author  yjl
   * date: 18-8-9 下午5:59
   */
  Object hashGet(String key, String hashKey);

  /**
   * 获取key的hash的大小
   * @param key 键
   * @return Long
   * @author  yjl
   * date: 18-8-17 下午5:50
   */
  Long hashSize(String key);

  /**
   * 获取key的hash的所有键和内容
   * @param key 键
   * @return Map<String, String>
   * @author  yjl
   * date: 18-8-17 下午6:24
   */
  Map<String, String> hashEntries(String key);

  /**
   * 从key的hash中删除hashKey
   * @param key 键
   * @param hashKey hashkey
   * @return Long
   * @author  yjl
   * date: 18-8-11 下午4:35
   */
  Long hashDelete(String key, String... hashKey);

  /**
   * 追加value到key的list集合的末端
   * @param key key
   * @param value value
   * @return Long
   * @author  yjl
   * date: 18-8-9 下午2:21
   */
  Long push(String key, Object value);

  /**
   * 追加多个value到key的list集合的末端
   * @param key key
   * @param values values
   * @return Long
   * @author  yjl
   * date: 18-8-17 下午4:11
   */
  Long pushAll(String key, Collection<Object> values);

  /**
   * 从key的list集合左侧获取value
   * @param key key
   * @return Object
   * @author  yjl
   * date: 18-8-10 下午1:21
   */
  Object pop(String key);

  /**
   * 从key的list集合中，获得从start到end之间的元素 <br/>
   * Get elements between {@code begin} and {@code end} from list at {@code key}.
   * @param key key
   * @param start 起始位置
   * @param end 结束位置
   * @return List<Object>
   * @author  yjl
   * date: 18-8-9 下午2:25
   */
  List<Object> range(String key, long start, long end);

  /**
   * 获取key的list的大小
   * @param key key
   * @return long
   * @author  yjl
   * date: 18-8-17 下午6:19
   */
  long sizeOfList(String key);

  /**
   * 增加values到key的set中
   * Add given {@code values} to set at {@code key}.
   * @param key key
   * @param values values
   * @author  yjl
   * date: 18-8-9 下午2:27
   */
  void setAdd(String key, Object... values);

  /**
   * 获取key的set中的所有元素 <br/>
   * Get all elements of set at key.
   * @param key key
   * @return Set<Object>
   * @author  yjl
   * date: 18-8-9 下午2:30
   */
  Set<Object> fetchSetMembers(String key);

  /**
   * 增加value到key的排序的set中，如果score已经存在则直接更新 <br/>
   * Add value to a sorted set at key, or update its score if it already exists.
   * @param key key
   * @param value value
   * @param score score
   * @author  yjl
   * date: 18-8-9 下午2:31
   */
  void zAdd(String key, Object value, double score);

  /**
   * 获取key的排序的set中，score值在min和max范围内的所有元素 <br/>
   * Get elements where score is between min and max from sorted set.
   * @param key key
   * @param min 最小值
   * @param max 最大值
   * @return Set<Object>
   * @author  yjl
   * date: 18-8-9 下午2:33
   */
  Set<Object> rangeByScore(String key, double min, double max);

  /**
   * 发布消息到channel
   * Publishes the given message to the given channel.
   * @param channel 频道
   * @param message 信息
   * @author  yjl
   * date: 18-8-9 下午2:34
   */
  void convertAndSend(String channel, Object message);


  /**
   * 清空redis中的缓存数据
   * @author  yjl
   * @date: 18-8-23 下午4:52
   */
  public void flushAll();

}
